package Server;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * ENGINE servera, sadrzi metode za upravljanje korisnicima (klijentima). Treba uraditi jos:
 * <ul>
 * <li> napisati mrezni deo aplikacije (da se preuzmu od klijenta ime i password
 * <li> da se definisu exception-i i da se handle-uju
 * </ul>
 * @author ivail
 */

public class Engine {
    
    /**
     *imena clanova liste ce biti originalna, ali password-i ce biti null
     */
    static public LinkedList <Korisnik> korisnici = new LinkedList<Korisnik>();
    
    /**
     * Metoda koja na osnovu username-a i password-a koji je prosledjen preko mreznog dela aplikacije kreira novog korisnika.
     * @author ivail
     * @return da li je kreiranje bilo uspesno
     */
    public static boolean napraviNovogKorisnika (String imenovi, String passwordnovi) throws Exception{

        try{
        Korisnik novi = new Korisnik (imenovi, passwordnovi);
        
        if (proveriDaLiVecPostoji(novi) == true) return false;
        else {
            if (dodajUNizKorisnika (novi) == false) return false;
            else {
                
                File newTextFile = new File ("/home/ivail/ServerProba/korisnici/"+imenovi+".txt");
                FileWriter fw = new FileWriter(newTextFile);
                fw.write(formatirajZaUpisUFajl(novi));
                fw.close();
                return true;
            }
        }
        } catch (Exception e){
            return false;
        }
    }
    
    /**
     * Samo proverava da li postoji novi korisnik u listi korisnika (Ignore Case)
     * @author ivail
     * @param proveri - korisnik kojeg treba proveriti
     * @return da li vec postoji korisnik
     */
    public static boolean proveriDaLiVecPostoji(Korisnik proveri){
        if (korisnici.isEmpty()){
            return false;
        }
        for (Korisnik korisnik: korisnici){
            System.out.println(korisnik.getIme()+"pre");
            if (proveri.getIme().equalsIgnoreCase(korisnik.getIme())) return true;
            System.out.println(korisnik.getIme()+"posle");
        }
        return false;
    }
    
    /**
     * Dodaje novog korisnika u niz
     * @author ivail
     * @param dodaj
     * @return da li je korisnik uspesno dodat u niz
     */
    
    public static boolean dodajUNizKorisnika (Korisnik dodaj){
        korisnici.add(dodaj);
        return true;
    }

/**
 * Samo formatira u pogodan oblik za txt
 * @param korisnik
 * @return String za upis u fajl
 */
    public static String formatirajZaUpisUFajl (Korisnik korisnik){
        return korisnik.getIme()+"$"+korisnik.getSifra();
    }
    
    /**Metoda koja proverava login korisnika
     * <b>Napomena: u ovom trenutku znamo da korisnik postoji!</b>
     * @param korisnik koji se proverava
     * @param string koji treba da se proveri
     * @return da li su ispravne credentials
     */
    public static boolean proveriPassword (Korisnik korisnik){
        try {
            BufferedReader br = new BufferedReader(new FileReader("/home/ivail/ServerProba/korisnici/"+korisnik.getIme()+".txt"));
            String tekst = br.readLine();
            int separator = tekst.indexOf("$");
            String imeKorisnika = tekst.substring(0, separator);
            String sifraKorisnika = tekst.substring(separator+1, tekst.length());
            System.out.println("Lalalaalal"+imeKorisnika);
            System.out.println("ahaahahahahahah"+sifraKorisnika);
            br.close();
            if (sifraKorisnika.equals(korisnik.getSifra())) return true;
            else return false;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } catch (IOException ex) {
            Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
    
    /**
     * Metoda koja puni niz korisnika
     */
    public static void napuniNizKorisnika(){
        String lokacija = "/home/ivail/ServerProba/korisnici/";
        File fajl = new File(lokacija);
        if (!fajl.exists()) fajl.mkdir();
        
        File folderKorisnika = new File (lokacija);
        for (File unos: folderKorisnika.listFiles()){
            String seci = unos.getName();
            
            Korisnik zile =  new Korisnik (seci.substring(0, seci.length()-4), null);
            korisnici.add(zile);
        }

    }
}
